perm filename FUNEXP.F4[RST,LCS] blob sn#168985 filedate 1975-07-17 generic text, type T, neo UTF8
00100	C  THIS PROGRAM(FUCOL.F4) CREATES FUNCTIONS FOR THE MUSIC PROGRAM
00200	C  USING 'SEG' OR 'SYNTH'.  UP TO 10 FUNCTIONS CAN BE STORED IN A
00300	C  SINGLE FILE.  ONCE CREATED, THE FUNCTIONS MAY BE CHANGED
00400	C  AND PUT BACK IN THE SAME FILE OR INTO A NEW ONE.
00500	C  NO MORE THAN 50 INPUTS FOR ONE FUNCTION!
00505	
00602	C TYPE 'C'(= CRUNCH)  FOR SPECIAL FEATURE SUBR TO COMBINE FUNCS 
00603	C ALREADY MADE.      [MULT, ADD, RETRO, INVRT, ADD CONSTANT ]
00610	
00611	C  SEG FUNCS MAY BE 'SMOOTHED' BUT THIS FEATURE AND 'CRUNCH' SHOULD 
00612	C  BE USED SPARINGLY AS ALL 512 WDS OF THE ARRAY MUST BE SAVED.  THIS
00613	C  CLUTTERS UP THE DSK.
00614	
00615	C  'Z' FOR "CHANGE OR FINISH?" WILL JUMP DIRECTLY TO "CRUNCH" MODE.
00700	C    BUT ONCE CHANGED BY 'CRUNCH' THIS UNSTORED ORIG. IS LOST.
00800	C'SP'(FOR "SEE")PLOTS ONE FUNC. (SA=PLOT ALL); 'SL' PUTS IT OUT ON
00805	C  THE LPT.
00810	
00900	C FOR EXPONENTIALS GET INTO 'SEG'.  TYPE 'X', DECAY FAC, N.  IF 
01000	C  N IS NON-ZERO THE FUNCTION WILL NOT! NORMALIZE (IE. NOT GO TO 0).
01100	C  AFTER A FILE HAS BEEN READ IN,
01150	C  THE DECAY FAC. IS THE NUM ALONGTHE SCALE(1-100) WHERE THE CURVE
01175	C  SEEMS TO TOUCH ZERO. (WILL ALWAYS HIT 0 AT END UNLESS N.NE.0.)
01180	
01200	C  <CR> FOR 'TYPE FILE' WILL HOLD ON TO IT.
01300	C  LOAD WITH -- WRIFUN,FUSUB,DFUEXP,SSS,LOOK.FAI (+RANFIL.MAC?)
01500		COMMON/S/H,AMP,CON,PH
01600		COMMON/RD/ A(50,4),B(2,10),FN(10),XA(10),AA(4,178,10)
01700		1,LX,JX,JT,IDEL,FNUM,FNUM1,Z,FLNM,FLNM1,KT
01800		COMMON FUNC(512),F2(512),K,I
01900		COMMON/LT/LPTY,JSEE
02000		DIMENSION RF(4)
02200	21	FORMAT(' C=CHANGE, F=FINISH '$)
02300	22	FORMAT(' NEW FUNC, EDIT, CRUNCH, DELETE, RENAME, SEE?   '$)
02400	23	FORMAT(' SEG OR SYNTH?   '$)
02600	25	FORMAT(' TYPE FILE NAME   '$)
02700	26	FORMAT(I3,') TYPE AMPL, STEP#  '$)
02800	C  'X' HERE WILL MAKE EXPON. FUNC.
02900	28	FORMAT(' 0=NORM,OR H,A,P,K   '$)
03000	280	FORMAT(
03100		1' UP TO 10 FUNCTIONS MAY BE STORED IN EACH FILE'/
03200		1' TYPE "B" TO BACKUP AT ANY TIME'//)
03300	30	FORMAT(8F)
03400	31	FORMAT(1XA5,A1,5A5/)
03600	35	FORMAT(1XA5,'IN FILE "',A5,'.DAT"'/)
03700	37	FORMAT(8F9.3)
03800	371	FORMAT(I3,') ',4F8.2)
03900	372	FORMAT(I,21F)
04000	38	FORMAT(2(A5,A1),23A2)
04300	40	FORMAT(11(A1,A3))
04400	41	FORMAT(' ADD TO AN EXISTING FILE?   '$)
04500	42	FORMAT(' WHICH FUNC?   '$)
04600	47	FORMAT(' C=CHNG, I=INSRT, D=DEL -- + LN# & CHNGS '$)
04700	48	FORMAT(' X,N(=DECAY FAC.) FOR XPONTLS')
04800	2281	TYPE 280
04900	281	KZ=0
05000		JSEE=0
05100		LPTY=5
05200	C   USED IN RELATIVE VECTOR ROUTINE
05300		Z=0
05400		EY=0
05500		ICUR=0
05600		XP=0
05650		KT=0
05700		FNUM=0
05800		OLD=0
05900		FNUM1=0
06000		TYPE 22
06100		ACCEPT 40,ON,P
06110		PLTALL=0
06155		IF(P.EQ.'A'.OR.P.EQ.'X')PLTALL=-1
06200	1281	IPLOT=0
06300	CC 7/74 COLGATE	IF(ON.EQ.'N'.OR.(ON.EQ.' '.AND.ONX.NE.'S'))GO TO 1000
06420		IF(ON.EQ.'N')GO TO 1000
06440		IF(ON.EQ.'E'.OR.ON.EQ.'R'.OR.ON.EQ.'D'
06470		1 .OR.ON.EQ.'C'.OR.ON.EQ.'S')GO TO 100
06500	CC 7/74 COLGATE	ON=ONX
06700	C ---OUT 7/74---  RETURNS FOR MORE "SEE"
06800	CC 7/74 COLGATE	GO TO 4281
06850		GO TO 281
06860	C  WON'T GO ON IF BLANK
06900	100	ONX=ON
07000		TYPE 25
07100		OLD=-1
07200		ACCEPT 38,FLNM1
07300		IF(FLNM1.EQ.' ')FLNM1=FLNM
07400		IF(FLNM1.EQ.0.OR.LOOKD(FLNM1).EQ.0)GO TO 100
07410	CC  NOT YET!	IF(FLNM1.EQ.0.OR.LOOKU(FLNM1).EQ.0)GO TO 100
07455	C  LOOKS UP NAME.DAT
07500		IF(FLNM.NE.FLNM1)GO TO 2151
07600		OLD=0
07700	4281	TYPE 40,B
07750		IF(PLTALL)GO TO 5402
07800		GO TO 1402
08000	2151	FLNM=FLNM1
08100		CALL READ1
08900	3402	LX=0
08905		TYPE 40,B
08910		IF(PLTALL)GO TO 402
08955	C  "SA" WILL PLOT ALL FUNCS IN FILE
09000		JX=-1
09100		IF(B(1,2).NE.' ')GO TO 1402
09200		FNUM1=B(2,1)
09300	C  ONLY ONE FUNC IN FILE.
09400		GO TO 402
09500	1402	TYPE 42
09600		ACCEPT 40,BU
09650		IF(BU.EQ.' ')GO TO 1402
09700		IF(BU.NE.'B')GO TO 380
09730		FLNM=0
09745		JX=0
09760		GO TO 281
09800	380	REREAD 38,FNUM1
09900		IDEL=0
10000	C  LX IS MAIN COUNTER
10100		IF(OLD)GO TO 402
10200		DO 1302 JX=1,10
10300	1302	IF(FNUM1.EQ.FN(JX))GO TO 5402
10400	CC 7/74 WHY WAS THIS HERE????	GO TO 3402
10450		GO TO 100
10500	2202	CALL DPYF(-1,FUNC)
10600	C  -1 SUPRESSES DISPLAY
10700		IF(P.EQ.'P'.OR.P.EQ.'A'.OR.P.EQ.0)GO TO 70
10800		LPTY=3
10900		JSEE=-1
11000		CALL DPY(FUNC,1)
11100		CALL EXIT
11200	70	CALL PLOTIT(FUNC,XA(JX),P)
11210		IF(P.EQ.'P')GO TO 2281
11220		JX=JX+1
11230		IF(B(2,JX).NE.' '.AND.JX.LE.10)GO TO 2202
11400	CC***	GO TO 2281
11450		CALL EXIT
11500	402	CALL READER
11550		IF(JX)GO TO 100
11575	C 6/74  GO BACK IF IT DIDN'T FIND THE FUNC NAME IN THIS FILE.
11600	C  AT THIS POINT LX=TOTAL FUNCS+1
11620	5402	IF(PLTALL)JX=1
11700	1202	IF(ON.NE.'C'.AND.ON.NE.'S'.AND.ON.NE.'D')GO TO 3281
11800		IF(P.EQ.'P'.OR.P.EQ.'L'.OR.P.EQ.'A')GO TO 2202
11900		CALL DPYF(JX,FUNC)
11910		IF(PLTALL.OR.P.EQ.'P'.OR.P.EQ.0)GO TO 2202
12000		IF(ON.EQ.'S')GO TO 2281
12100		IF(ON.EQ.'C')GO TO 1201
12200	1140	TYPE 1139
12300		ACCEPT 40,IDEL
12400		IF(IDEL.EQ.'N')GO TO 2281
12450		IF(IDEL.NE.'Y')GO TO 1140
12500		IDEL=JX
12600		LX=LX-1
12700	C  NOW LX=TOTAL # OF FUNCS.
12800		CALL WRIFUN
12900	1139	FORMAT(' DELETE IT? ',$)
12910	CC2202	CALL PLOTIT(FUNC,XA(JX),P)
12925	CC	IF(P.EQ.'P')GO TO 2281
12940	CC	JX=JX+1
12955	CC	IF(B(2,JX).NE.' '.AND.JX.LE.10)GO TO 1202
12970	CCC  "SA" KEEPS PLOTTING UNTIL NO MORE ARE FOUND
12985	CC	GO TO 2281
13000	3281	X=' '
13100		TYPE 31,XA(JX),X,FN(JX)
13200		JT=4
13300		IF(XA(JX).EQ.'SEG')JT=2
13400		KZ=1
13500		DO 137	K=1,50
13600		KZ=KZ+1
13700		DO 138 L=1,JT
13800	138	A(K,L)=AA(L,K,JX)
13900	137	IF(A(K,1).EQ.999.OR.A(K,2).GE.100)GO TO 4401
14000	
14100	4401	Z=-1
14200		IF(A(K,2).LE.100)GO TO 4403
14300		IF(K.GT.1)GO TO 4404
14400		CALL DPYF(JX,FUNC)
14500		IF(ON.EQ.'R')GO TO 3032
14600		TYPE 4405
14700		A(1,2)=520
14950		GO TO 4201
15000	4404	TYPE 4402
15100	4403	IF(JT.EQ.2)EY='EG'
15200		GO TO 1032
15300	4402	FORMAT('  IT WAS SMOOTHED.')
15400	4405	FORMAT(' CANNOT EDIT CRUNCHED FUNCS.'/)
15500	1000	TYPE 23
15600		ACCEPT 40,BU
15700		IF(BU.EQ.'B')GO TO 281
15800		REREAD 40,X,EY
15900	1032	CALL ZERO(FUNC)
16000	C  CLEARS THE FUNC.
16100		ISMOO=0
16200		IF(EY.EQ.'EG')GO TO 800
16300	151	EY=0
16400		JT=4
16500	C  FOR WRIFUN
16600	15	KT=1
16700	104	IF(Z.EQ.-1.OR.KT.LT.KZ)GO TO 102
16800		IF(Z.EQ.1)GO TO 2032
16900	1041	KZ=0
17000		TYPE 28
17010		Z=0
17055	C:::: 6/74 COLGATE  Z=0
17100		ACCEPT 40,BU
17200		IF(BU.EQ.'B')GO TO 509
17300		REREAD 30,(A(KT,K),K=1,4)
17400	C ACCEPT HARM,AMPL,PHASE,KONSTANT(IF K>100, MULTIPLIES WAVE *(K-100))
17500	102	H=A(KT,1)
17600		IF(H.EQ.0.OR.H.EQ.999.)GO TO 2200
17700	C   999 ENDS 'READIN' SYNTHS
17800		IF(Z.GT.0)TYPE 371,KT,(A(KT,K),K=1,4)
17900		AMP=A(KT,2)
18000		PH=A(KT,3)
18100		CON=A(KT,4)
18200		CALL SYN(FUNC)
18300		KT=KT+1
18400		IF(KZ.LE.KT)CALL DPY(FUNC,1)
18500		GO TO 104
18510	2201	IF(JT.NE.2.OR.A(KT-1,2).GT.100)GO TO 1201
18520	C  TO USE CURRENT FUNC IN CRUNCH
18532		IF(LX.GT.10)GO TO 204
18545		CALL STORE(10)
18562	C  PUTS FROM A ARRAY TO AA ARRAY
18580		XA(K)='SEG'
18590	CC 6/74 COLGATE--SEE ALSO FUSUB 	CALL DPYF(K,FUNC)
18690		CALL DPYF(10,FUNC)
18700	1201	CALL ZFUNC
18800	C  THIS WILL BE FOR SPECIAL FEATURE PACKAGE
18810		IF(KT.EQ.512)GO TO 2281
18855	C  FOR BACKUP
18860	4201	EY='EG'
18900		KT=2
19000		GO TO 900
19050	2200	IF(KT.LE.1)GO TO 509
19075	C  7/74 COLGATE  BACKUP IF NO INPUT TO SYNTH
19100	CC2200	CALL NORM(FUNC)
19150		CALL NORM(FUNC)
19200	C   NORMALIZES THE FUNCTION
19210	201	CALL DPY(FUNC,1)
19300		IF(BU.EQ.'C')GO TO 2032
19400		IF(ON.EQ.'R')GO TO 3032
19600	204	TYPE 21
19700		IF(EY.EQ.'EG')TYPE 271
19800	C   CHANGE IT?
19900		ACCEPT 40,BU
20000		IF(BU.EQ.'C')GO TO 210
20300		IF(BU.EQ.'F')GO TO 900
20400		IF(BU.EQ.'S')GO TO 7000
20500		IF(BU.EQ.'Z')GO TO 2201
20510	C  TO USE CURRENT FUNC IN CRUNCH
20600		IF(BU.NE.'B')GO TO 2032
20700		IF(EY.EQ.'EG')GO TO 509
20800		GO TO 5091
20900	C   NEXT IS FOR CHANGES ('C' OR <CR>)
21300	2032	TYPE 47
21400		ACCEPT 40,K
21500		REREAD 372,L,X,RF
21600		IF(X.NE.0.OR.RF(1).NE.0)GO TO 211
21700		IF(EY.EQ.'EG')GO TO 204
21800		BU=0
21900		GO TO 1041
22000	211	L=X
22100		IF(K.EQ.'I')GO TO 212
22200		IF(K.NE.'D')GO TO 205
22300	C   JUMP IF NO DELETE
22400		KT=KT-1
22500		DO 209 K=L,KT
22600		DO 209 J=1,4
22700	209	A(K,J)=A(K+1,J)
22800		GO TO 210
22900	205	X=RF(2)
23000		IF(EY.NE.'EG')GO TO 1207
23100		IF(X.GE.A(L+1,2).AND.L.LT.KT-1)GO TO 2032
23200		GO TO 208
23300	212	IF(RF(2).NE.0)GO TO 213
23400		RF(2)=RF(1)
23500		RF(1)=X
23600		L=KT
23700	213	IF(EY.NE.'EG')GO TO 214
23800		X=RF(2)
23900		DO 215 K=1,KT
24000		Y=A(K,2)
24100		IF(X.GT.Y)GO TO 215
24200	C   JUMP IF NOT PAST STEP NUM.
24300		L=K
24400		IF(X.EQ.Y)GO TO 208
24500	C   IF STEP=ANOTHER STEP, IT WORKS LIKE 'C'HANGE.
24600		GO TO 214
24700	215	CONTINUE
24800	214	KT=KT+1
24900		DO 206 K=KT,L,-1
25000		DO 206 J=1,4
25100	206	A(K,J)=A(K-1,J)
25200		GO TO 207
25300	C   TO TYPE OLD NUMBERS
25400	208	IF(X.LE.A(L-1,2).AND.L.GT.1)GO TO 2032
25500	1207	TYPE 371,L,(A(L,K),K=1,4)
25600	207	DO 202 K=1,4
25700	202	A(L,K)=RF(K)
25800	210	KZ=KT
25900		Z=1
26000		GO TO 1032
26100	271	FORMAT('+S=SMOOTH  '$)
26110	C  FOR RENAMES
26140	3032	Z=-1
26170		GO TO 901
26200	900	TYPE 41
26300	C  ADD TO EXISTING FILE
26400		ISKP=0
26500		ACCEPT 40,Z
26600	9000	IF(Z.EQ.'B')GO TO 204
26650		IF(Z.NE.'Y'.AND.Z.NE.'N')GO TO 900
26700		TYPE 25
26800		ACCEPT 38,FLNM
26810		IF(FLNM.EQ.' '.AND.FLNM1.NE.' ')FLNM=FLNM1
26858		IF(FLNM.EQ.'B'.OR.FLNM.EQ.' ')GO TO 204
26900	CC*** NOT YET!	IF(LOOKU(FLNM))GO TO 902
26927	C  LOOKS UP NAME.DAT  (NOT .FUN AS YET)
26954		IF(LOOKD(FLNM))GO TO 902
27002		IF(Z.NE.'N')GO TO 900
27050	C  LOOKD CHECKS ON LOOK-UP
27100	901	JT=4
27200		IF(EY.EQ.'EG')JT=2
27250		IDEL=0
27300		CALL WRIFUN
27400		GO TO 900
27500	C  COMES BACK IF NO ROOM IN FILE FOR NEW FUNC.
27600	
27610	902	IF(Z.NE.'N')GO TO 901
27625		TYPE 381,FLNM
27640		ACCEPT 40,Z
27655		IF(Z.EQ.'Y')GO TO 903
27670		GO TO 9000
27675	903	Z='N'
27680		GO TO 901
27682	C  7/74 COLGATE  NOW WILL REALLY WRITE OVER A FILE!
27685	381	FORMAT(/9X'WRITE OVER ',A5,'.DAT?  ',$)
27700	161	DO 261 K=1,512
27800	261	FUNC(K)=EXP((1-K)/STEP)
27900		KT=2
28000		XP=-1
28100		IF(H.NE.0)GO TO 7009
28200	C  H≠0 = NO NORMALIZATION OF XPONTL
28300		X=FUNC(512)
28400		DO 361 K=1,512
28500	361	FUNC(K)=FUNC(K)-(K-1)/511.*X
28600		GO TO 7009
28700	800	IF(XP)GO TO 510
28800		X=0
28900		IK=0
29000		JT=2
29100	C  JT AND EY SEEM TO PERFORM THE SAME FUNCTIONS??
29200		Y=0
29300		KT=1
29400	504	IF(KT.GE.KZ)GO TO 510
29500		AMP=A(KT,1)
29600	5008	STEP=A(KT,2)
29700		IF(STEP.LE.A(KT-1,2).AND.KT.GT.1)GO TO 509
29800	C   SO IT CAN'T GO BACKWARDS
29900		GO TO 5071
30000	611	FORMAT(' NO MORE THAN 50 SEGS'/)
30100	610	TYPE 611
30200	509	KT=KT-1
30300	5091	IF(KT.LT.1)GO TO 281
30400		GO TO 210
30500	510	IF(KT.EQ.1)TYPE 48
30600		TYPE 26,KT
30700		KZ=0
30800		ACCEPT 40,BU
30900		IF(BU.EQ.'B')GO TO 509
31000	61	REREAD 30,AMP,STEP,H
31100		IF(STEP.LT.1)STEP=1
31200		IF(BU.EQ.'X')GO TO 161
31300	C  TYPE 'X' FOR EXPON. FUNC. + DECAY FACTOR, +1 = NO NORM.
31400	C  WE START WITH STEP 1 (NOT 0)
31500	5071	IF(KT.GT.50)GO TO 610
31600	C   TOO MANY SEGS
31700		IF(Z.GT.0)TYPE 371,KT,AMP,STEP
31800		IF(STEP.GT.100)STEP=100
31900		STPS=STEP-X
32000		IF(STPS.LE.0.AND.KT.NE.1)GO TO 504
32100	C   SO IT CAN'T BACKUP HERE
32200		IS=STPS
32300		IF(STEP.LE.1.)Y=AMP
32400	CC COLGATE 6/74	DIF=(AMP-Y)/STPS
32420		IF(IS.NE.0)DIF=(AMP-Y)/STPS
32500		IJ=STPS*5.12
32700	203	DO 2031 K=1,IJ
32800	2031	FUNC(K+IK)=Y+DIF*K/5.12
32900	C   100 STEPS ARE CONVERTED HERE TO 512
33000		IK=IK+IJ
33100	12	Y=AMP
33200		X=STEP
33300		A(KT,1)=Y
33400		A(KT,2)=X
33500	7001	KT=KT+1
33600	C   KT COUNTS SEGMENTS
33700		IF(STEP.LT.100)GO TO 504
33800		GO TO 201
33900	
34000	
34100	7000	IF(ISMOO)GO TO 201
34200		IF(KT.LE.20)GO TO 7007
34300		TYPE 7008
34400		GO TO 509
34500	7008	FORMAT(' NO MORE THAN 20 SEGS IN CURVES'/)
34600	7007	CALL SSS(A,KT-1,FUNC)
34700	C   DRAWS GRID 2
34800	7009	A(KT-1,2)=520
34900		ISMOO=-1
35000	C  SO YOU CAN'T COME BACK 2 TIMES
35100		GO TO 201
35200		END
00100		SUBROUTINE WRIFUN
00200		COMMON/RD/ A(50,4),B(2,10),FN(10),XA(10),AA(4,178,10)
00300		1,LX,JX,J,IDEL,FNUM,FNUM1,Z,FLNM,FLNM1,KT
00400		COMMON FUNC(512),F2(512),K,I
00500		DATA ARY/'ARRAY'/,R999/999.0/
00600	24	FORMAT(' TYPE FUNCTION NAME   '$)
00800	34	FORMAT(A5,'(',A5,');',A5)
00900	35	FORMAT(1XA5,'IN FILE "',A5,'.DAT"'/)
01000	37	FORMAT(8F10.4)
01100	39	FORMAT(A5,10(A1,A3))
01150	391	FORMAT(A3)
01200	390	FORMAT(A1)
01300	43	FORMAT(' NO ROOM IN FILE  "',A5,'.DAT"')
01400	44	FORMAT(' FUNCTIONS ALREADY IN FILE - ',A5)
01500	45	FORMAT('(512);')
01600	
01650		MX=0
01700		IF(IDEL.NE.0)GO TO 292
01800	C  FOR DELETIONS
01900		IF(Z.EQ.'N')GO TO 912
02000		IF(FLNM.EQ.FLNM1)GO TO 1922
02100	C  JUMP IF THAT FILE IS NOW IN CORE
02200	CC	REWIND 1
02300	CC	CALL IFILE(1,FLNM)
02400	CC	READ(1,39),X,B
02450		CALL READ1
02475	1922	IF(Z.EQ.'N')GO TO 912
02500	CC COLGATE 7/741922	TYPE 44,FLNM
02550		TYPE 44,FLNM
02600	C  FUNCS. IN FILE
02700		TYPE 39,MX,B
02800	912	TYPE 24
02900		ACCEPT 390,FNUM
02905		IF(FNUM.EQ.'B')RETURN
02907	C  FOR BACKUP
02910		IF(FNUM.EQ.' ')GO TO 1922
02912		REREAD 391,FNUM
02915		IF(Z.EQ.'N')GO TO 911
02920		IF(Z.NE.-1)GO TO 90
02930	C JUMP IF .NE. 'RENAME'
02931	C 7/74 COLGATE
02932		DO 30 K=1,LX-1
02933		IF(K.EQ.JX.OR.FN(K).NE.FNUM)GO TO 30
02934		TYPE 31
02935		CALL EXIT
02936	31	FORMAT(/' FUNC NAME IN USE!')
02937	30	CONTINUE
02940		B(2,JX)=FNUM
02950		FN(JX)=FNUM
02955		LX=LX-1
02960	CC	MX=127
02970		GO TO 1906
03000	90	IF(FLNM.EQ.FLNM1)GO TO 1090
03100		FNUM1=0
03200		LX=0
03400	C  TO PUT NEW FUNC IN OLD FILE
03500		CALL READER
03600	1090	JX=0
03700		MX=LX
03800		DO 20 K=1,LX-1
03900		IF(FNUM.NE.FN(K))GO TO 20
04000		JX=K
04100		LX=LX-1
04200		GO TO 21
04300	20	CONTINUE
04400	210	JX=LX
04500	C  JX=LX IF FNUM WAS NOT FOUND
04600		IF(JX.GT.10)GO TO 193
04700	21	FN(JX)=FNUM
04800		X='SEG'
04900		IF(J.EQ.4)X='SYNTH'
05000		XA(JX)=X
05100		CALL STORE(JX)
05500		IF(J.EQ.2)GO TO 1192
05600		AA(1,KT,JX)=999
05700		GO TO 192
05800	1192	IF(A(KT-1,2).EQ.100)GO TO 192
05900	C  JUMP IF NO SMOOTHING
06100		DO 2192 K=1,512
06200	2192	AA(K,KT,JX)=FUNC(K)
06500	
06900	192	IF(JX.NE.1)B(1,JX)=','
07000		B(2,JX)=FNUM
07100		GO TO 1906
09500	193	TYPE 43,FLNM
09600	C  NO ROOM IN FILE.
09800		RETURN
09900	C  NEW FILE
10400	911	LX=1
10500		DO 94 K=1,20
10700	94	B(K,1)=' '
10850		GO TO 210
10900	C  CLEARS B FOR NEW, SINGLE ITEM.
12130	292	IF(IDEL.EQ.10)GO TO 932
12141		DO 931 K=IDEL,LX-1
12152	CC	FN(K)=FN(K+1)
12163	931	B(2,K)=B(2,K+1)
12174	932	B(1,LX)=' '
12185		B(2,LX)=' '
12200	1906	REWIND 1
12210		IF(Z.EQ.'N'.OR.IDEL.GT.0)GO TO 22
12220		DO 25 K=1,LX
12225		IF(K.GT.1.AND.B(1,K).NE.',')GO TO 26
12230		X=B(2,K)
12240		IF(X.NE.' '.AND.X.EQ.FN(K))GO TO 25
12250	26	TYPE 23
12260		RETURN
12270	23	FORMAT(/' CONFUSION IN THIS FILE. TRY ANOTHER! '/)
12280	25	CONTINUE
12300	22	CALL OFILE(1,FLNM)
12350	CC  NOT YET! 22	CALL OFLE(1,FLNM,'.FUN')
12375	C  COLGATE OFILE REPLACEMENT.  ALL FUNC FILES WILL BE '.FUN'.
12400		WRITE(1,39),ARY,B
12500		WRITE(1,45)
13100	69	NX=0
13200	1905	IF(NX.EQ.LX)GO TO 904
13250	C  LX=TOTAL # OF FUNCS
13300		NX=NX+1
13400		IF(IDEL.EQ.NX)GO TO 1905
13431	C  SO THAT DATA MUST ALWAYS BE READ FROM DSK AFTER A DEL.
13450	CC1	YA(NX)=' '
13460	CC	IF(XA(NX).EQ.'SYNTH')YA(NX)='   99'
13500	CC	WRITE(1,34),XA(NX),FN(NX),YA(NX)
13600	1	J=4
13610		X='   99'
13620		IF(XA(NX).NE.'SEG')GO TO 68
13630		J=2
13640		X=' '
13650	68	WRITE(1,34),XA(NX),FN(NX),X
13800		JX=0
13900	2905	JX=JX+1
14000		IF(J.EQ.2)GO TO 3905
14100		IF(AA(1,JX,NX).EQ.999)GO TO 5905
14200	C  FOUND END OF A SYNTH
14300		WRITE(1,37),(AA(K,JX,NX),K=1,4)
14400		GO TO 2905
14500	5905	WRITE(1,37)R999
14600		GO TO 1905
14650	3905	X=AA(2,JX,NX)
14700		WRITE(1,37),AA(1,JX,NX),X
14800		IF(X.EQ.100)GO TO 1905
14900	C  FOUND END OF A SEG
15000		IF(X.LT.100)GO TO 2905
15350		WRITE(1,37)(AA(K,JX+1,NX),K=1,512)
15400		GO TO 1905
15500	904	TYPE 39,MX,B
16000		IF(IDEL.EQ.0)TYPE 35,FNUM,FLNM
16035		IF(IDEL.NE.0)FLNM=0
16050		LX=LX+1
16075	C  FOR RESTARTS
16175		CALL EXIT
16700		END
16710	
16800		SUBROUTINE READER
16900		COMMON/LN/LINE
17000		COMMON/RD/ A(50,4),B(2,10),FN(10),XA(10),AA(4,178,10)
17100		1,LX,JX,J,IDEL,FNUM,FNUM1,Z,FLNM,FLNM1,KT
17200		COMMON FUNC(512),F2(512),K,I
17300	37	FORMAT(8F)
17400	38	FORMAT(3(A5,A1))
17500	380	FORMAT(I,3(A5,A1))
17600	39	FORMAT(9A5)
17700		READ (1,39),K,K,AK
17800	C  READS "(512);"
17900	C  LX IS MAIN COUNTER
18000	401	LX=LX+1
18100	1	IF(LINE.EQ.0)READ(1,38,END=4401)XA(LX),Y,FN(LX),H,H
18200		IF(LINE)READ(1,380,END=4401)K,XA(LX),Y,FN(LX),H,H
18300		IF(XA(LX).GE.0)GO TO 1
18400	C  TO FIND EOF AFTER COPY SCREWUPS
18500		IF(FNUM1.EQ.FN(LX))JX=LX
18600	C  JX TELLS WHERE TO FIND FUNCTION TO BE LOOKED AT.
18700	C  XA(LX) IS FUNC. TYPE (SEG OR SYNTH)
18800		X=0
18900		N=4
19000		IF(XA(LX).EQ.'SEG')N=2
19100		KX=0
19200	C  KX IS LOCAL COUNTER
19300	1401	IF(X.EQ.100)GO TO 401
19400		KX=KX+1
19500		IF(LINE.EQ.0)READ(1,37),(AA(K,KX,LX),K=1,N)
19600		IF(LINE)READ(1,37)AK,(AA(K,KX,LX),K=1,N)
19700		IF(N.EQ.2)GO TO 2401
19800		IF(AA(1,KX,LX).EQ.999)GO TO 401
19900	C  FOUND END OF A SYNTH
20000		GO TO 1401
20100	2401	X=AA(2,KX,LX)
20200		IF(X.LE.100)GO TO 1401
20300	C  NEXT IS FOR SMOOTHED SEGS
20500		N=KX+1
20505		IF(LINE)GO TO 2
20600		READ(1,37)(AA(K,N,LX),K=1,512)
20700		GO TO 401
20710	370	FORMAT(9F)
20800	2	DO 3 K=1,512,8
20833	3	READ(1,370)AK,(AA(KX,N,LX),KX=K,K+7)
20866		GO TO 401
20900	4401	RETURN
21000		END
21100	
21200	
21300		SUBROUTINE READ1
21400	C  READS FIRST LINE OF FILE ONLY
21500		COMMON/LN/LINE
21600		COMMON/RD/ A(50,4),B(2,10),FN(10),XA(10),AA(4,178,10)
21700		1,LX,JX,JT,IDEL,FNUM,FNUM1,Z,FLNM,FLNM1,KT
21800	2151	REWIND 1
21900		CALL IFILE(1,FLNM)
21950	CC  NOT YET!	CALL IFLE(1,FLNM,'.FUN')
22000		READ (1,39),X,B
22100		LINE=0
22200		IF(X)RETURN
22300		LINE=-1
22400	C  FOUND LN #S (CAN'T READ SMOOTHS 'THO)
22500		REREAD 390,LX,X,B
22600		RETURN
22700	39	FORMAT(A5,10(A1,A3))
22800	390	FORMAT(I,A5,10(A1,A3))
22900		END
23000	
23100		SUBROUTINE STORE(N)
23200		COMMON/RD/ A(50,4),B(2,10),FN(10),XA(10),AA(4,178,10)
23300		1,LX,JX,J,IDEL,FNUM,FNUM1,Z,FLNM,FLNM1,KT
25000		DO 3090 K=1,KT-1
25100		DO 3090 L=1,J
25200	3090	AA(L,K,N)=A(K,L)
25300		RETURN
25400		END
00100		SUBROUTINE ZFUNC
00200		COMMON/RD/ A(50,4),B(2,10),FN(10),XA(10),AA(4,178,10)
00300		1,LX,JX,JT,IDEL,FNUM,FNUM1,Z,FLNM,FLNM1,KT
00400		COMMON FUNC(512),F2(512),K,I
00500	
00600	43	TYPE 1
00700		ACCEPT 100,MA,C
00720		IF(MA.NE.'B')GO TO 76
00740	430	KT=512
00760	C  FOR BACKUP
00780		RETURN
00900	76	IF(MA.NE.'A'.AND.MA.NE.'M')GO TO 73
00950	75	TYPE 39,B
01000		TYPE 2
01100		ACCEPT 3,FNM2
01150		IF(FNM2.EQ.'B')GO TO 43
03000	40	DO 4 K=1,10
03100	5	IF(FNM2.NE.FN(K))GO TO 4
03200		N2=K
03300		GO TO 72
03400	4	CONTINUE
03500		TYPE 74
03600		GO TO 75
03700	74	FORMAT(' FUNCTION NOT FOUND '/)
03800	72	CALL DPYF(N2,F2)
03910	7	TYPE 60
03940		ACCEPT 100,K
03970		IF(K.EQ.'B'.OR.K.EQ.'N')GO TO 15
03980		IF(MA.EQ.'M')GO TO 102
04000	70	TYPE 10
04100		ACCEPT 11,R,R2
04150		REREAD 100,K
04175		IF(K.EQ.'B')GO TO 75
04200		IF(R2.EQ.0)R2=1
04300		IF(R.EQ.0)R=1
04400		DO 13 K=1,512
04450		X=FUNC(K)
04500		FUNC(K)=FUNC(K)*R+F2(K)*R2+C
04550	13	F2(K)=X
04600		GO TO 104
04700	73	IF(MA.NE.'C')GO TO 44
04716		DO 45 K=1,512
04732		F2(K)=FUNC(K)
04748	45	FUNC(K)=FUNC(K)+C
04764		GO TO 104
04780	44	IF(MA.NE.'I')GO TO 46
04796		DO 47 K=1,512
04812		F2(K)=FUNC(K)
04828	47	FUNC(K)=C-FUNC(K)
04844		GO TO 104
04860	46	IF(MA.NE.'R')GO TO 75
04876	48	DO 50 K=1,512
04892	50	F2(K)=FUNC(513-K)
04908		DO 51 K=1,512
04924		X=FUNC(K)
04940		FUNC(K)=F2(K)+C
04956	51	F2(K)=X
04972		GO TO 104
05000	102	DO 103 K=1,512
05050		X=FUNC(K)
05100		FUNC(K)=FUNC(K)*F2(K)+C
05150	103	F2(K)=X
05200	104	A(1,2)=520
05300		CALL NORM(FUNC)
05400	C   NORMALIZES THE FUNCTION
05500		CALL DPY(FUNC,1)
05600		TYPE 6
05700		ACCEPT 100,K
05800		IF(K.EQ.'M')GO TO 43
05900		IF(K.NE.'B')RETURN
05910		DO 14 K=1,512
05920	14	FUNC(K)=F2(K)
05940	15	CALL DPY(FUNC,1)
05950		GO TO 43
06000	1	FORMAT
06050	     1(' A(DD), M(ULT), R(ETRO), I(NVRT), OR C,N (=ADD CONSTANT N) ',$)
06100	100	FORMAT(A1,F)
06200	2	FORMAT(' 2ND FUNC? ',$)
06300	3	FORMAT(A3)
06400	10	FORMAT(' TYPE RATIO (E.G. 1,2) ',$)
06410	39	FORMAT(10(A1,A3))
06500	11	FORMAT(2F)
06600	6	FORMAT(' F(INISH), OR M(ORE)?  ',$)
06650	60	FORMAT(' GO ON?  ',$)
06700		END
06800	
06900		SUBROUTINE DPYF(N,F)
07000		COMMON/S/H,AMP,CON,PH
07100		COMMON/RD/ A(50,4),B(2,10),FN(10),XA(10),AA(4,178,10)
07200		1,LX,JX,JT,IDEL,FNUM,FNUM1,Z,FLNM,FLNM1,KT
07300		DIMENSION F(1)
07305		NODPY=-1
07310		IF(N.GT.0)GO TO 8
07320		N=JX
07330		NODPY=0
07400	CC COLGATE 6/74--SEE MAIN AT 1201-18	IF(XA(N).EQ.'SEG')GO TO 5
07410	8	IF(XA(N).NE.'SYNTH')GO TO 5
07500		CALL ZERO(F)
07600		K=1
07700	1	AMP=AA(2,K,N)
07800		H=AA(1,K,N)
07900		PH=AA(3,K,N)
08000		CON=AA(4,K,N)
08100		CALL SYN(F)
08200		K=K+1
08300		IF(AA(1,K,N).NE.999)GO TO 1
08400		CALL NORM(F)
08500		GO TO 4
08800	
08900	5	K=1
08920		G=AA(2,1,N)
09000		IF(G.EQ.520)GO TO 6
09010		J=1
09020		IF(G.LE.1)GO TO 22
09030		Y=0
09040		K=0
09045	C  FOR START BEYOND STEP 1 - ASSUMES A 0,1.
09050		GO TO 2
09100	22	Y=AA(1,1,N)
09300	2	K=K+1
09400		M=AA(2,K,N)*5.12+.5
09500		IF(M.GT.512)GO TO 6
09600		G=AA(1,K,N)
09700		Z=G-Y
09800		H=M-J+1
09850		IF(H.LT.1)H=1
09900		NN=0
10000		DO 3 L=J,M
10100		F(L)=(NN*Z)/H+Y
10200	3	NN=NN+1
10300		IF(M.EQ.512)GO TO 4
10400		Y=G
10500		J=M+1
10600		GO TO 2
10700	C  FOR LONG FUNCS.
10800	6	L=K+1
10900		DO 7 M=1,512
11000	7	F(M)=AA(M,L,N)
11100	4	IF(NODPY)CALL DPY(F,-1)
11110	C  NODPY=0 IS FOR PLOTTER AND LPT
11200	C  NOW FUNCTION IS FULL AND DISPLAYED
11300		RETURN
11400		END
11500	
11600		SUBROUTINE SYN(F)
11700		COMMON/S/H,AMP,CON,PH
11800		DIMENSION F(1)
11900		DATA FAC/0.703125/,FACP/1.422222/
12000		X=PH*FACP+1.0
12100	C  PHASE IS IN DEGREES (0 - 360)
12200	2016	DO 17 L=1,512
12300		XL=SIND(X*FAC)*AMP+CON
12400		IF(CON.LT.100.0)GO TO 1
12500		F(L)=(XL-100.)*F(L)
12600		GO TO 2
12700	1	F(L)=F(L)+XL
12800	C   NORMALIZES THE FUNCTION
12900	2	X=X+H
13000	17	IF(X.GT.512.)X=X-512.
13100		RETURN
13200		END
13300	
13400		SUBROUTINE ZERO(F)
13500		DIMENSION F(1)
13600		DO 1 K=1,512
13700	1	F(K)=0
13800		RETURN
13900		END
14000	
14100		SUBROUTINE NORM(F)
14200		DIMENSION F(1)
14300		X=F(1)
14400	C   NORMALIZES THE FUNCTION
14500		DO 19 K=2,512
14600		XK=ABS(F(K))
14700	19	IF(X.LT.XK)X=XK
14800		DO 20 K=1,512
14900	20	F(K)=F(K)/X
15000		RETURN
15100		END
00100	C  ********** DISPLAY OR PLOT OUTPUT **********
00200		SUBROUTINE DPY(F,IY)
00300		DIMENSION H(120)
00400		COMMON/LT/LPTY,JSEE
00500		DIMENSION F(1)
00600		DATA Q/'X'/
00700		IF(JSEE)GO TO 1
00800		TYPE 2
00900		ACCEPT 3,N
01000		IF(N.NE.'Y')RETURN
01100	1	M=72
01200		JR=12
01300		NN=23
01400		IF(LPTY.EQ.5)GO TO 7
01500		M=120
01600		JR=26
01700		NN=51
01800	7	RH=512.0/M
01900		T=1
02000		S=2.0/NN+.001
02100		DO 4 K=1,NN
02200		R=1.-K*S
02300		H(1)='!'
02400		A=' '
02500		IF(K.EQ.JR)A='-'
02600	6	DO 11 L=2,M
02700	11	H(L)=A
02800		J=1
02900		RJ=1
03000	12	DO 9 L=1,M
03100		A=F(J)
03200		IF(A.GT.R.AND.A.LE.T)H(L)=Q
03300		RJ=RJ+RH
03400	9	J=RJ
03500		T=R
03600	4	WRITE(LPTY,20)(H(L),L=1,M)
03700		IF(LPTY.NE.5)RETURN
03800		TYPE 5
03900		ACCEPT 3,N
04000		RETURN
04100	20	FORMAT(1X120A1)
04200	2	FORMAT(' SEE IT? '$)
04300	3	FORMAT(A1)
04400	5	FORMAT(' <CR>=CONTINUE'$)
04500		END
04600	
04700		SUBROUTINE PLOTIT(FUNC,EY,P)
04800		COMMON/RD/ A(50,4),B(2,10),FN(10),XA(10),AA(4,178,10)
04900		1,LX,JX,JT,IDEL,FNUM,FNUM1,Z,FLNM,FLNM1,KT
05000		DIMENSION FUNC(1)
05100		IF(P.EQ.'P')GO TO 1
05200		IF(P.EQ.0)GO TO 4
05300		Y=1
05400		X=2.
05500	CC	IF(P.NE.'X')GO TO 6
05600	CC	X=1.5
05700	CC	Y=.5
05800	6	CALL PLOTS(K)
05900		P=0
06000		GO TO 40
06100	1	TYPE 2
06200		CALL PLOTS(K)
06300		ACCEPT 3,X
06400		IF(X.EQ.0)X=SZX
06500		IF(X.EQ.0)X=1.
06600		SZX=X
06700	40	SZ=X/5.12
06710		CALL PLOT(0,17.*SZ,-3)
06755	C  ABOVE FOR COLGATE PLOTTER.
06800	41	S=0
06900		J=1
07000		RJK=X/8.
07100		CALL SYMBOL(SZ,4.*SZ,RJK,FLNM,0,5)
07200	4	CALL SYMBOL(SZ,-3.*SZ,RJK,B(2,JX),0,3)
07300		CALL PLOT(5.12*SZ,0.,3)
07400		CALL PLOT(0.,0.,2)
07500		CALL PLOT(0.,-2.*SZ,3)
07600		CALL PLOT(0.,2.*SZ,2)
07700	
07800	72	CALL PLOT(.01*SZ,FUNC(1)*2.*SZ,3)
07900		DO 73 K=2,512
08000		R=K/100.0
08100	73	CALL PLOT(R*SZ,FUNC(K)*2.*SZ,2)
08200		T=0
08300		Q=Y+5*SZ
08400		IF(J.NE.5)GO TO 5
08500		Q=-S
08600		T=-7*SZ
08700	5	CALL PLOT(Q,T,-3)
08800		S=S+Q
08900		J=J+1
09000		RETURN
09100	
09200	2	FORMAT(' TYPE SIZE - '$)
09300	3	FORMAT(F)
09400		END
	SUBROUTINE SSS(VV,N1,A1)
	DIMENSION V(50,4),A1(512),C(30,4),YP(30),J(30),NX(3),KA(14),K(9)
	DIMENSION VV(50,4)
	EQUIVALENCE(K1,K(1)),(K2,K(2)),(K3,K(3)),(K4,K(4)),(K5,K(5)),
     1	(K6,K(6)),(K7,K(7)),(K8,K(8)),(K9,K(9))
	DATA KA/1,2,2,1,1,2,1,1,0,2,1,-1,0,1/,DX/.00001/
	IF(VV(1,2).EQ.0) VV(1,2)=1
	DO 5 I=1,30
	DO 5 L=1,2
5	V(I,L)=VV(I,L)
	NX(1)=N1
698	NX(2)=NX(1)-1
	DO 10 I=1,NX(1)
10	V(I,2)=(V(I,2)-1)/99.
	DO 20 I=2,NX(2)
	JX=I+1
	JZ=I-1
	YP(I)=(V(JX,1)-V(JZ,1))/(V(JX,2)-V(JZ,2))
20	IF((V(JX,1)-V(I,1))*(V(I,1)-V(JZ,1)).LE.0) YP(I)=0
	DO 22 I=1,9
22	K(I)=KA(I)
	KOUNT=0
21	KOUNT=KOUNT+1
	V1=V(K2,1)-V(K1,1)
	V2=V(K2,2)-V(K1,2)
802	IF((YP(K2)-V1/V2)*(V(K3,1)-V(K4,1)).GT.0) GO TO 30
24	Z=V(K2,K5)+(V(K1,K6)-V(K2,K6))*YP(K2)**K7
	IF(YP(K2)**2.LT.DX.AND.V1**2.LT.DX) GO TO 36
	IF(YP(K2)**2.LT.DX) GO TO 38
	D1=V(K2,K5)-Z
806	D2=Z-V(K1,K5)
	ZZ=(V(K1,K6)*D2+V(K2,K6)*D1)/(D1+D2)
808	YP(K1)=(ZZ*K9+V(K2,1)*K8-V(K1,1))/
     1	(ZZ*K8+V(K2,2)*K9-V(K1,2))
	GO TO 40
30	DO 32 I=5,9
32	K(I)=KA(I+5)
	GO TO 24
36	YP(K1)=0
	GO TO 40
38	YP(K1)=-100
	IF(KOUNT.EQ.2) GO TO 39
	IF(V(K2,1).GT.V(K1,1)) YP(K1)=100
	GO TO 40
39	IF(V(K2,1).LT.V(K1,1)) YP(K1)=100
40	IF(KOUNT.EQ.2) GO TO 50
	DO 42 I=1,2
	K(I)=NX(I)
42	K(I+2)=K(I)     
	DO 44 I=5,9
44	K(I)=KA(I)
	GO TO 21
50	NX(3)=NX(2)-1
	N=1
52	N=N+1
	IF(N.GT.NX(3)) GO TO 92
	JX=N+1
	V1=V(JX,1)-V(N,1)
	V2=V(JX,2)-V(N,2)
	Y1=YP(N)-YP(JX)
	IF(Y1**2.LT.DX.AND.V1**2.GT.DX) GO TO 720
710	X=(V1-YP(JX)*V(JX,2)+YP(N)*V(N,2))/Y1                   
715	IF(X.GE.V(N,2).AND.X.LE.V(JX,2)) GO TO 52      
	IF(Y1**2.LT.DX.AND.V1**2.LT.DX) GO TO 52
720	DO 120 I=NX(1),JX,-1
	JZ=I+1
	V(JZ,2)=V(I,2)
	V(JZ,1)=V(I,1)
120	YP(JZ)=YP(I)
	YP(JX)=.5*V1/V2
	IF(V1*(YP(N)-V1/V2).LE.0) YP(N+1)=4*YP(JX)
	V(JX,2)=.5*(V(N+2,2)+V(N,2))
	V(JX,1)=.5*(V(N+2,1)+V(N,1))
	N=JX
	DO 88 L=1,3
88	NX(L)=NX(L)+1
  	GO TO 52
92	DO 140 I=1,NX(2)
	JX=I+1
	W0=YP(I)
	W1=YP(JX)
	W2=V(JX,2)-V(I,2)
	W3=V(JX,1)-V(I,1)
	C(I,1)=(W2*(W0+W1)-2*W3)/(W0-W1)
	C(I,2)=W2-C(I,1)
	C(I,4)=W0*C(I,2)
140	C(I,3)=-C(I,4)+W3
730	DO 150 I=1,NX(1)
150	J(I)=511*V(I,2)+1
740	DO 160 I=1,NX(2)
	L1=J(I)+1
	IF(I.EQ.1) L1=1
	ZZ=C(I,2)
	XX=C(I,1)
	L2=J(I+1)
750	DO 160 L=L1,L2
	X=(FLOAT(L)-1.)/511.
	IF(XX**2.LT.DX) GO TO 155
	ZX=.5*SQRT(ZZ**2-4*XX*(V(I,2)-X))/XX
	T1=-.5*ZZ/XX+ZX
	T2=T1-2*ZX
	IF(T2.GT.-DX.AND.T2.LT.(1+DX)) T1=T2
155	IF(XX**2.LT.DX) T1=-(V(I,2)-X)/ZZ
160   	A1(L)=C(I,3)*T1**2+C(I,4)*T1+V(I,1)
770	END